{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "G:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\ensemble\\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release.\n",
      "  from numpy.core.umath_tests import inner1d\n"
     ]
    }
   ],
   "source": [
    "# 主要包\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "# 绘图\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "# 模型\n",
    "# 集成学习 RF GDBT\n",
    "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n",
    "# 线性回归 Ridge 和ElasticNet\n",
    "from sklearn.linear_model import Ridge, RidgeCV\n",
    "from sklearn.linear_model import ElasticNet, ElasticNetCV\n",
    "# 支持向量机\n",
    "from sklearn.svm import SVR\n",
    "# skew度量倾斜度(偏度)(三阶中心距),和正态化\n",
    "from scipy.stats import skew, norm\n",
    "# scipy中的方法\n",
    "from scipy.special import boxcox1p\n",
    "from scipy.stats import boxcox_normmax\n",
    "# 网格搜索最优模型\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "# 交叉验证,交叉验证的评估分数\n",
    "from sklearn.model_selection import KFold, cross_val_score\n",
    "# mse\n",
    "from sklearn.metrics import mean_squared_error\n",
    "# 将分类整数特征编码为即“one-of-K”或“dummy”\n",
    "from sklearn.preprocessing import OneHotEncoder\n",
    "# 它还可以用于将非数字标签(只要它们是可耐洗和可比较的)转换为数字标签。\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "# 生成管道\n",
    "from sklearn.pipeline import make_pipeline\n",
    "# StandardScaler和scale的区别是使用StandardScaler会保留测试集合均值和标准差同样在测试集上进行标准化\n",
    "from sklearn.preprocessing import scale\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "# 使用对异常值具有鲁棒性的统计数据来缩放特性。\n",
    "from sklearn.preprocessing import RobustScaler\n",
    "# 降维\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "# 忽略警告\n",
    "import warnings\n",
    "warnings.filterwarnings(action=\"ignore\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Id</th>\n",
       "      <th>MSSubClass</th>\n",
       "      <th>MSZoning</th>\n",
       "      <th>LotFrontage</th>\n",
       "      <th>LotArea</th>\n",
       "      <th>Street</th>\n",
       "      <th>Alley</th>\n",
       "      <th>LotShape</th>\n",
       "      <th>LandContour</th>\n",
       "      <th>Utilities</th>\n",
       "      <th>...</th>\n",
       "      <th>PoolArea</th>\n",
       "      <th>PoolQC</th>\n",
       "      <th>Fence</th>\n",
       "      <th>MiscFeature</th>\n",
       "      <th>MiscVal</th>\n",
       "      <th>MoSold</th>\n",
       "      <th>YrSold</th>\n",
       "      <th>SaleType</th>\n",
       "      <th>SaleCondition</th>\n",
       "      <th>SalePrice</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>65.0</td>\n",
       "      <td>8450</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Reg</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>208500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>20</td>\n",
       "      <td>RL</td>\n",
       "      <td>80.0</td>\n",
       "      <td>9600</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Reg</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>2007</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>181500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>68.0</td>\n",
       "      <td>11250</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>223500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>70</td>\n",
       "      <td>RL</td>\n",
       "      <td>60.0</td>\n",
       "      <td>9550</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2006</td>\n",
       "      <td>WD</td>\n",
       "      <td>Abnorml</td>\n",
       "      <td>140000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>84.0</td>\n",
       "      <td>14260</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>250000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 81 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Id  MSSubClass MSZoning  LotFrontage  LotArea Street Alley LotShape  \\\n",
       "0   1          60       RL         65.0     8450   Pave   NaN      Reg   \n",
       "1   2          20       RL         80.0     9600   Pave   NaN      Reg   \n",
       "2   3          60       RL         68.0    11250   Pave   NaN      IR1   \n",
       "3   4          70       RL         60.0     9550   Pave   NaN      IR1   \n",
       "4   5          60       RL         84.0    14260   Pave   NaN      IR1   \n",
       "\n",
       "  LandContour Utilities    ...     PoolArea PoolQC Fence MiscFeature MiscVal  \\\n",
       "0         Lvl    AllPub    ...            0    NaN   NaN         NaN       0   \n",
       "1         Lvl    AllPub    ...            0    NaN   NaN         NaN       0   \n",
       "2         Lvl    AllPub    ...            0    NaN   NaN         NaN       0   \n",
       "3         Lvl    AllPub    ...            0    NaN   NaN         NaN       0   \n",
       "4         Lvl    AllPub    ...            0    NaN   NaN         NaN       0   \n",
       "\n",
       "  MoSold YrSold  SaleType  SaleCondition  SalePrice  \n",
       "0      2   2008        WD         Normal     208500  \n",
       "1      5   2007        WD         Normal     181500  \n",
       "2      9   2008        WD         Normal     223500  \n",
       "3      2   2006        WD        Abnorml     140000  \n",
       "4     12   2008        WD         Normal     250000  \n",
       "\n",
       "[5 rows x 81 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 加载数据集\n",
    "train = pd.read_csv('input/house-prices-advanced-regression-techniques/train.csv')\n",
    "test = pd.read_csv('input/house-prices-advanced-regression-techniques/test.csv')\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 让数据拟合正态分布\n",
    "train[\"SalePrice\"] = np.log1p(train[\"SalePrice\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 去除噪声点\n",
    "train.drop(train[(train['OverallQual']<5) & (train['SalePrice']>200000)].index, inplace=True)\n",
    "train.drop(train[(train['GrLivArea']>4500) & (train['SalePrice']<300000)].index, inplace=True)\n",
    "# 去除后更新索引\n",
    "train.reset_index(drop=True, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2917, 80)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 分割特征和标签\n",
    "# 设置SalePrice为标签\n",
    "train_labels = train['SalePrice'].reset_index(drop=True)\n",
    "# 移除SalePrice后的剩余属性设置为特征\n",
    "train_features = train.drop(['SalePrice'], axis=1)\n",
    "test_features = test\n",
    "# 结合训练和测试的特征，以便将整个数据集在管道中应用\n",
    "all_features = pd.concat([train_features, test_features]).reset_index(drop=True)\n",
    "all_features.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 一些非数字数据存储为数字;把它们转换成字符串 apply可以直接进行转换\n",
    "all_features['MSSubClass'] = all_features['MSSubClass'].apply(str)\n",
    "all_features['YrSold'] = all_features['YrSold'].astype(str)\n",
    "all_features['MoSold'] = all_features['MoSold'].astype(str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def handle_missing(features):\n",
    "    # 数据描述说明NA引用典型('Typ')值\n",
    "    features['Functional'] = features['Functional'].fillna('Typ')\n",
    "    # 用它们的模式替换下面每一列中缺失的值\n",
    "    features['Electrical'] = features['Electrical'].fillna(\"SBrkr\")\n",
    "    features['KitchenQual'] = features['KitchenQual'].fillna(\"TA\")\n",
    "    features['Exterior1st'] = features['Exterior1st'].fillna(features['Exterior1st'].mode()[0])\n",
    "    features['Exterior2nd'] = features['Exterior2nd'].fillna(features['Exterior2nd'].mode()[0])\n",
    "    features['SaleType'] = features['SaleType'].fillna(features['SaleType'].mode()[0])\n",
    "    features['MSZoning'] = features.groupby('MSSubClass')['MSZoning'].transform(lambda x: x.fillna(x.mode()[0]))\n",
    "    \n",
    "    # NA引用“No Pool”的数据描述统计信息\n",
    "    features[\"PoolQC\"] = features[\"PoolQC\"].fillna(\"None\")\n",
    "    # 用0替换缺失的值，因为没有garage =车库中没有汽车\n",
    "    for col in ('GarageYrBlt', 'GarageArea', 'GarageCars'):\n",
    "        features[col] = features[col].fillna(0)\n",
    "    # 将丢失的数据设置为None\n",
    "    for col in ['GarageType', 'GarageFinish', 'GarageQual', 'GarageCond']:\n",
    "        features[col] = features[col].fillna('None')\n",
    "    # NaN values for these categorical basement features, means there's no basement\n",
    "    for col in ('BsmtQual', 'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinType2'):\n",
    "        features[col] = features[col].fillna('None')\n",
    "        \n",
    "    # 按照neighborhoods分组, 并按照neighborhood的LotFrontage 的中值进行填充\n",
    "    features['LotFrontage'] = features.groupby('Neighborhood')['LotFrontage'].transform(lambda x: x.fillna(x.median()))\n",
    "\n",
    "    # 对于如何填充其余的分类特征，我们没有特别的直觉\n",
    "    # 所以我们用None替换它们缺失的值\n",
    "    objects = []\n",
    "    for i in features.columns:\n",
    "        if features[i].dtype == object:\n",
    "            objects.append(i)\n",
    "    features.update(features[objects].fillna('None'))\n",
    "    # 我们对数值特征做同样的处理，但这次填充的是0\n",
    "    numeric_dtypes = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']\n",
    "    numeric = []\n",
    "    for i in features.columns:\n",
    "        if features[i].dtype in numeric_dtypes:\n",
    "            numeric.append(i)\n",
    "#     将特征中存在的类型添加到numeric中，将这些属性的特征中确实的值填入0\n",
    "    features.update(features[numeric].fillna(0))    \n",
    "    return features\n",
    "\n",
    "all_features = handle_missing(all_features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'1stFlrSF': 0.0,\n",
       " '2ndFlrSF': 0.0,\n",
       " '3SsnPorch': 0.0,\n",
       " 'Alley': 0.0,\n",
       " 'BedroomAbvGr': 0.0,\n",
       " 'BldgType': 0.0,\n",
       " 'BsmtCond': 0.0,\n",
       " 'BsmtExposure': 0.0,\n",
       " 'BsmtFinSF1': 0.0,\n",
       " 'BsmtFinSF2': 0.0,\n",
       " 'BsmtFinType1': 0.0,\n",
       " 'BsmtFinType2': 0.0,\n",
       " 'BsmtFullBath': 0.0,\n",
       " 'BsmtHalfBath': 0.0,\n",
       " 'BsmtQual': 0.0,\n",
       " 'BsmtUnfSF': 0.0,\n",
       " 'CentralAir': 0.0,\n",
       " 'Condition1': 0.0,\n",
       " 'Condition2': 0.0,\n",
       " 'Electrical': 0.0,\n",
       " 'EnclosedPorch': 0.0,\n",
       " 'ExterCond': 0.0,\n",
       " 'ExterQual': 0.0,\n",
       " 'Exterior1st': 0.0,\n",
       " 'Exterior2nd': 0.0,\n",
       " 'Fence': 0.0,\n",
       " 'FireplaceQu': 0.0,\n",
       " 'Fireplaces': 0.0,\n",
       " 'Foundation': 0.0,\n",
       " 'FullBath': 0.0,\n",
       " 'Functional': 0.0,\n",
       " 'GarageArea': 0.0,\n",
       " 'GarageCars': 0.0,\n",
       " 'GarageCond': 0.0,\n",
       " 'GarageFinish': 0.0,\n",
       " 'GarageQual': 0.0,\n",
       " 'GarageType': 0.0,\n",
       " 'GarageYrBlt': 0.0,\n",
       " 'GrLivArea': 0.0,\n",
       " 'HalfBath': 0.0,\n",
       " 'Heating': 0.0,\n",
       " 'HeatingQC': 0.0,\n",
       " 'HouseStyle': 0.0,\n",
       " 'Id': 0.0,\n",
       " 'KitchenAbvGr': 0.0,\n",
       " 'KitchenQual': 0.0,\n",
       " 'LandContour': 0.0,\n",
       " 'LandSlope': 0.0,\n",
       " 'LotArea': 0.0,\n",
       " 'LotConfig': 0.0,\n",
       " 'LotFrontage': 0.0,\n",
       " 'LotShape': 0.0,\n",
       " 'LowQualFinSF': 0.0,\n",
       " 'MSSubClass': 0.0,\n",
       " 'MSZoning': 0.0,\n",
       " 'MasVnrArea': 0.0,\n",
       " 'MasVnrType': 0.0,\n",
       " 'MiscFeature': 0.0,\n",
       " 'MiscVal': 0.0,\n",
       " 'MoSold': 0.0,\n",
       " 'Neighborhood': 0.0,\n",
       " 'OpenPorchSF': 0.0,\n",
       " 'OverallCond': 0.0,\n",
       " 'OverallQual': 0.0,\n",
       " 'PavedDrive': 0.0,\n",
       " 'PoolArea': 0.0,\n",
       " 'PoolQC': 0.0,\n",
       " 'RoofMatl': 0.0,\n",
       " 'RoofStyle': 0.0,\n",
       " 'SaleCondition': 0.0,\n",
       " 'SaleType': 0.0,\n",
       " 'ScreenPorch': 0.0,\n",
       " 'Street': 0.0,\n",
       " 'TotRmsAbvGrd': 0.0,\n",
       " 'TotalBsmtSF': 0.0,\n",
       " 'Utilities': 0.0,\n",
       " 'WoodDeckSF': 0.0,\n",
       " 'YearBuilt': 0.0,\n",
       " 'YearRemodAdd': 0.0,\n",
       " 'YrSold': 0.0}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.DataFrame(all_features)\n",
    "df_cols = list(pd.DataFrame(data))\n",
    "dict_x = {}\n",
    "for i in range(0, len(df_cols)):\n",
    "    # round 可以进行四舍五入，这里我们对每一列的空值进行均值化，算出百分比\n",
    "    dict_x.update({df_cols[i]: round(data[df_cols[i]].isnull().mean()*100,2)})\n",
    "dict_x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "There are 25 numerical features with Skew > 0.5 :\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "MiscVal          21.939672\n",
       "PoolArea         17.688664\n",
       "LotArea          13.109495\n",
       "LowQualFinSF     12.084539\n",
       "3SsnPorch        11.372080\n",
       "KitchenAbvGr      4.300550\n",
       "BsmtFinSF2        4.144503\n",
       "EnclosedPorch     4.002344\n",
       "ScreenPorch       3.945101\n",
       "BsmtHalfBath      3.929996\n",
       "dtype: float64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 获取所有数值特征\n",
    "numeric_dtypes = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']\n",
    "numeric = []\n",
    "for i in all_features.columns:\n",
    "    if all_features[i].dtype in numeric_dtypes:\n",
    "        numeric.append(i)\n",
    "# 找到扭曲的数值特征\n",
    "skew_features = all_features[numeric].apply(lambda x: skew(x)).sort_values(ascending=False)\n",
    "\n",
    "high_skew = skew_features[skew_features > 0.5]\n",
    "skew_index = high_skew.index\n",
    "\n",
    "print(\"There are {} numerical features with Skew > 0.5 :\".format(high_skew.shape[0]))\n",
    "skewness = pd.DataFrame({'Skew' :high_skew})\n",
    "skew_features.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Normalize倾斜的特性\n",
    "for i in skew_index:\n",
    "    # boxcoxlp变换可以保证线性回归满足独立，线性，齐性，正态性的同时，不丢失信息\n",
    "    # 总而言之就是将数据正态化\n",
    "#     all_features[i] = boxcox1p(all_features[i], boxcox_normmax(all_features[i] + 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2917, 333)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_features = pd.get_dummies(all_features).reset_index(drop=True)\n",
    "all_features.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1458, 333), (1458,), (1459, 333))"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = all_features.iloc[:len(train_labels), :]\n",
    "X_test = all_features.iloc[len(train_labels):, :]\n",
    "X.shape, train_labels.shape, X_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 设置交叉验证折叠\n",
    "kf = KFold(n_splits=4, random_state=42, shuffle=True)\n",
    "# 定义误差评定指标\n",
    "def rmsle(y, y_pred):\n",
    "    return np.sqrt(mean_squared_error(y, y_pred))\n",
    "\n",
    "def cv_rmse(model, X=X):\n",
    "    rmse = np.sqrt(-cross_val_score(model, X, train_labels, scoring=\"neg_mean_squared_error\", cv=kf))\n",
    "    return (rmse)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Ridge Regressor\n",
    "ridge_alphas = [1e-15, 1e-10, 1e-8, 9e-4, 7e-4, 5e-4, 3e-4, 1e-4, 1e-3, 5e-2, 1e-2, 0.1, 0.3, 1, 3, 5, 10, 15, 18, 20, 30, 50, 75, 100]\n",
    "ridge = make_pipeline(RobustScaler(), RidgeCV(alphas=ridge_alphas, cv=kf))\n",
    "\n",
    "# Support Vector Regressor\n",
    "svr = make_pipeline(RobustScaler(), SVR(C= 20, epsilon= 0.008, gamma=0.0003))\n",
    "\n",
    "# Gradient Boosting Regressor\n",
    "gbr = GradientBoostingRegressor(n_estimators=6000,\n",
    "                                learning_rate=0.01,\n",
    "                                max_depth=4,\n",
    "                                max_features='sqrt',\n",
    "                                min_samples_leaf=15,\n",
    "                                min_samples_split=10,\n",
    "                                loss='huber',\n",
    "                                random_state=42)  \n",
    "\n",
    "# Random Forest Regressor\n",
    "rf = RandomForestRegressor(n_estimators=1200,\n",
    "                          max_depth=15,\n",
    "                          min_samples_split=5,\n",
    "                          min_samples_leaf=5,\n",
    "                          max_features=None,\n",
    "                          oob_score=True,\n",
    "                          random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SVR: 0.1108 (0.0115)\n",
      "ridge: 0.1117 (0.0089)\n",
      "rf: 0.1411 (0.0097)\n",
      "gbr: 0.1142 (0.0084)\n"
     ]
    }
   ],
   "source": [
    "scores = {}\n",
    "score = cv_rmse(svr)\n",
    "print(\"SVR: {:.4f} ({:.4f})\".format(score.mean(), score.std()))\n",
    "scores['svr'] = (score.mean(), score.std())\n",
    "score = cv_rmse(ridge)\n",
    "print(\"ridge: {:.4f} ({:.4f})\".format(score.mean(), score.std()))\n",
    "scores['ridge'] = (score.mean(), score.std())\n",
    "score = cv_rmse(rf)\n",
    "print(\"rf: {:.4f} ({:.4f})\".format(score.mean(), score.std()))\n",
    "scores['rf'] = (score.mean(), score.std())\n",
    "score = cv_rmse(gbr)\n",
    "print(\"gbr: {:.4f} ({:.4f})\".format(score.mean(), score.std()))\n",
    "scores['gbr'] = (score.mean(), score.std())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Svr\n",
      "Ridge\n",
      "RandomForest\n",
      "GradientBoosting\n"
     ]
    }
   ],
   "source": [
    "print('Svr')\n",
    "svr_model_full_data = svr.fit(X, train_labels)\n",
    "print('Ridge')\n",
    "ridge_model_full_data = ridge.fit(X, train_labels)\n",
    "print('RandomForest')\n",
    "rf_model_full_data = rf.fit(X, train_labels)\n",
    "print('GradientBoosting')\n",
    "gbr_model_full_data = gbr.fit(X, train_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABYsAAALeCAYAAADrkk7QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3Xd0VGXixvFnUichgdBLCDUkkCZN\nmkLonVDEirCruyywsuqCCqJIUxRXXBV2ERQbgv6UDoK0gAbpLj0kEEkIvQQI6WVyf3/EjEaqkuSm\nfD/n5Mh76zOXcJx5cvNei2EYhgAAAAAAAAAAZZqD2QEAAAAAAAAAAOajLAYAAAAAAAAAUBYDAAAA\nAAAAACiLAQAAAAAAAACiLAYAAAAAAAAAiLIYAAAAAAAAACDKYgAAABSBTZs2acSIEWrbtq2CgoJ0\n//33a9SoUdq0aZPZ0Yqt7OxszZgxQ/fdd5+Cg4PVr1+/m247fvx4+fv7y9/fXytWrLjlcUeOHGnf\ntqC99tpr8vf3186dO//Q/p07d1bLli0LOBUAAADulJPZAQAAAFC6TZs2TZ9//rm8vb3VpUsXVaxY\nUefPn9d3332n8PBwPfTQQ5o2bZrZMYudxYsX66OPPlL9+vU1cOBAVa5c+Y7227Bhg/r373/DdcnJ\nyfrhhx8KMiYAAABKEcpiAAAAFJqdO3fq888/V48ePfT222/LyemXt59JSUkaNmyYvvrqK4WGhqpr\n164mJi1+IiMjJUmvvPKK2rVrd0f7VK1aVVu3blVaWprc3NyuW79582ZlZmbK3d1dqampBZoXAAAA\nJR/TUAAAAKDQbNmyRZI0ZMiQfEWxJHl6emrs2LGScu+GRX6ZmZmSpIoVK97xPl26dFFaWpq2bt16\nw/Xr1q1Tw4YNVadOnQLJCAAAgNKFshgAAACFJisrS5J09OjRG65v2bKl3nnnHf35z3/Ot9xms+nj\njz9WWFiYmjZtqtDQUD3//PM6efJkvu0yMzP1/vvvq3fv3goKClLr1q01atQoHTx4MN92S5culb+/\nv9auXau//OUvCg4OVqdOnezHS05O1ltvvaWuXbsqKChI7du316RJk5SQkHBd5gULFmjQoEFq1qyZ\nmjdvrscee0xr166942vyww8/6IknnlDz5s0VEhKigQMHauHChcrJyZEknTp1Sv7+/lq2bJkkacCA\n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\njh1v+D0OAAB+QVkMAACAIlOuXDmFhoYqNDRU48aN0+LFizVx4kR9/vnnGj16tNzc3HTt2jVVqVLl\nlsdJSUmRpJveWZpXGKWnp+db7urqmm987do1SdLx48c1e/bsm54vMTFRkjRmzBjVrVtXX375pQ4c\nOKD9+/dr1qxZql+/viZNmqS2bdve9Bh5dyffKvOv75i8G927d9e//vUv7d27Vy1atNC6detUr149\nNW7c+KbZXF1db1jAenp6ys3NTWlpaZJ+uWblypW7blsvL69847xtIyIi8pXIv5WSknLD0j80NFSf\nffaZ5s+fr23btmnBggVasGCBvLy8NHr0aA0dOvSmx0TBW79+vdLT0/Xss8+qV69eWrRokVauXHnd\ndvfee68GDhx43QMppdy7zf/5z38qJCREBw4csC8fO3aswsPD1atXr3wPjNy5c6fOnz+vSZMm6dFH\nH9WWLVv0wQcf6Nq1a9q7d6+ysrK0YsUKLViwQO3bt9dnn32mnJwcffHFF+rTp4/++te/6qGHHtKE\nCRNUv379wrkwAACUIkxDAQAAgEKRnJys7t27a8SIETdcb7FY9OCDD+q+++5Tenq6zp07Jyl3Woa8\nMvi3UlNTJf1SVF64cOGG2+WVlL8tL38r7zj9+/dXdHT0Tb86d+5szzx48GAtXrxYP/zwg9566y31\n6NFDcXFxGjVqlC5fvnzbc90sc2Ji4m3z3qkePXpIkjZs2KDMzExt2bLlpncV52VLS0tTUlLSdesy\nMjKUnp6uihUrSpJ96om88vvXfvv35u7uLkl67bXXbnl9b1QU52nVqpXmzp2rnTt36oMPPtCQIUOU\nmZmpV199Vd99991trgQKUl75W7VqVft/ExIS7D9IyPPjjz9q6dKl+aZ8kaSkpCQ99NBDGjJkiAYO\nHJhv3dixY3Xs2DG1atXqtuc0DEOnT59WQkKCgoKCNGXKFH366afavn27hg8frvPnzys5OVmnT59W\nvXr1VKtWLf33v//lbnQAAO4AZTEAAAAKhYeHh5KSkrRt2zZdunTplts6ODjYyyA/Pz+dOXNGFy9e\nvG67AQMGqEePHvLw8FDt2rUVGxt7w4J29+7dkiRfX99bnrd+/fpycXHR4cOHZRjGdes/+eQT/fe/\n/9WVK1d05coVzZo1S8uWLZMkVa5cWf369dN7772nQYMGKS0tTZGRkTc9V95dvXv27Llu3YkTJ3Tx\n4kU1atTolnnvlI+Pj5o0aaKNGzfqhx9+UHJy8i3L4ltl+/HHH2UYhv1aBgYG2pf/1qFDh/KN/f39\nb7hckrKysvTGG29owYIFN8316aef2qclcHd3V4cOHfTKK69o0qRJN82Awpc3ZUjev5nfTiGSN6/4\nb40YMUKGYejNN99Udna2pNwfRhiGoaCgoFuWuTc656BBg3Tw4EGNHj1ajz32mHr27KlNmzYpKytL\nknTs2DHNmjVLo0aN0uzZs6+bLgMAAFyPshgAAACFJu8u0KeffvqGd9Ru2rRJ27ZtU7du3ex3l4aF\nhckwDL311luy2Wz2bdeuXasTJ07Yp3oYOHCg0tPTNX36dHvxJOXOk/v555+rfPny9juCb8bV1VW9\ne/dWTEyMPv7443zrdu7cqTfffFNLlixRhQoVVK5cOX322Wf697//ratXr+bb9syZM5KkWrVq3fRc\n/fv3l5OTk95///18v56fmpqqqVOn2rcpKN27d9fJkyf1/vvvq27dumrSpMlNtx00aJAk6e23385X\nvl++fFlvvvlmvmy9e/eWq6ur5syZk6/Q37Nnj8LDw/Md995771Xt2rW1ePFi7d27N9+6efPm6eOP\nP7bPa3wjW7du1fvvv5/vYWeSdPr0aUm3vt4oeHlzfuf9vV+6dEmVK1eW1Wq9o/2/+OILHTt2TJUr\nV9Zrr70mKfcHFbeafuVG57RYLPL29taGDRs0efJk+4MQs7Oz5ejoqJo1a8pqtapNmzbq16+fxowZ\nIyl3CgwAAHBrzFkMAACAQjNq1CgdPXpU69atU/fu3XX//ferXr16ys7O1v79+/W///1PDRo00OTJ\nk+37DB48WOvXr9fy5csVHR2t1q1b6/z581q/fr28vb3tD7kbPny4tm7dqlWrVik6Olpt2rRRQkKC\nNm7cKMMw9O9///uW0xvkGTdunPbu3asZM2Zo06ZNCgkJsZ/PyclJ06dPl4ODg1xcXPT000/r1Vdf\nVd++fdWtWzdZrVbt3r1bBw8eVP/+/dWgQYObnsfHx0fjxo3Ta6+9poEDB6pr165yd3fX999/r5Mn\nT6pPnz4aMGDAXV/zPD169NC7776rffv23XQqkDz33nuvnnjiCX388ccKCwtTp06dJEmbN2/WxYsX\nNXz4cPuD+by9vTVu3DhNnTpVAwcOVLdu3ZSUlKRvv/1WNWvWVHx8vP24jo6OmjFjhoYPH67HH39c\nXbp0kY+Pjw4dOqQdO3aodu3a9iLvRv7xj39o586dGjZsmHr27Knq1asrJiZGmzdvVsOGDRUWFlYA\nVwp3qmvXrnJxcdG7776rCxcuKCIiQo8++qiOHz+u48ePq02bNrf8N7d9+3b7nz/88EPNnz9fS5cu\nVc2aNW+6T+vWrVW5cmV9+OGH8vLy0ooVK9SpUyd5enoqNjZWU6ZM0dWrVxUYGKj169dr6NChcnZ2\n1uDBg7Vs2TJ98skn9jvbW7duXXAXAwCAUoqyGAAAAIXG0dFR7733njZs2KCVK1fqwIED+v777+Xs\n7Ky6detq7NixGjZsWL47Ex0dHTVnzhzNnz9fK1as0MKFC+Xh4WG/Q7BChQqScu8K/uSTTzR//nyt\nWrVKX3zxhcqXL69OnTppxIgRCggIuKOMlSpV0ldffaW5c+dqw4YNWrBggSpVqqTOnTvr73//e76H\nwg0dOlSVK1fWZ599pjVr1igtLU316tXTiy++qMcff/y25xo2bJjq1aun+fPna/369TIMQw0bNtSI\nESM0ePDg33l1b61hw4Zq2LChfvrpJ/scxrcyfvx4BQQEaOHChVq1apWcnJzUpEkTvfLKK+revXu+\nbYcMGaLq1atr7ty5Wrp0qSpWrKinn35aLi4uev311/Nt27JlS3399deaM2eOtm/frs2bN6tGjRoa\nOnSoRo4cecuHGYaEhOjzzz/XnDlztGPHDl2+fFnVqlXTsGHDNGrUKPucyCga3t7eWrJkiZ577jmN\nHj1aPXv21JtvvqlZs2ZpypQp2rt3r5o2bXrT/du0aWP/87fffitJatas2XUPnvw1q9Wq1atX66mn\nntLw4cPVqlUrzZ8/X1LuD4xOnDih+fPnKzk5WQ8++KB92pK8OYrHjh0rV1dXvfLKK3f0bxQAgLLO\nYtxocjYAAAAAAAAAQJnCnMUAAAAAAAAAAMpiAAAAAAAAAABlMQAAAAAAAABAPODujqSnp+vQoUOq\nWrWqHB0dzY4DAAAAAAAAAH+IzWbTxYsXFRQUlO9B0xJl8R05dOiQhgwZYnYMAAAAAAAAACgQCxcu\nVMuWLfMtoyy+A1WrVpWUewFr1KhhchoAAAAAAAAA+GPOnTunIUOG2DvPX6MsvgN5U0/UqFFDtWvX\nNjkNAAAAAAAAANydG023ywPuAAAAAAAAAACUxQAAAAAAAAAAymIAAAAAAAAAgCiLAQAAAAAAAACi\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x200087d44e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.set_style(\"white\")\n",
    "fig = plt.figure(figsize=(24, 12))\n",
    "\n",
    "ax = sns.pointplot(x=list(scores.keys()), y=[score for score, _ in scores.values()], markers=['o'], linestyles=['-'])\n",
    "for i, score in enumerate(scores.values()):\n",
    "    ax.text(i, score[0] + 0.002, '{:.6f}'.format(score[0]), horizontalalignment='left', size='large', color='black', weight='semibold')\n",
    "\n",
    "plt.ylabel('Score (RMSE)', size=20, labelpad=12.5)\n",
    "plt.xlabel('Model', size=20, labelpad=12.5)\n",
    "plt.tick_params(axis='x', labelsize=13.5)\n",
    "plt.tick_params(axis='y', labelsize=12.5)\n",
    "\n",
    "plt.title('Scores of Models', size=20)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSLE score on train data:\n",
      "0.07898517714469282\n"
     ]
    }
   ],
   "source": [
    "def blended_predictions(X):\n",
    "    return ((0.1 * ridge_model_full_data.predict(X)) + \\\n",
    "            (0.2 * svr_model_full_data.predict(X)) + \\\n",
    "            (0.15 * gbr_model_full_data.predict(X))+ \\\n",
    "            (0.55 * rf_model_full_data.predict(X)))\n",
    "# Get final precitions from the blended model\n",
    "blended_score = rmsle(train_labels, blended_predictions(X))\n",
    "scores['blended'] = (blended_score, 0)\n",
    "print('RMSLE score on train data:')\n",
    "print(blended_score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1459, 2)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取sample_submission的数据\n",
    "submission = pd.read_csv(\"input/house-prices-advanced-regression-techniques/sample_submission.csv\")\n",
    "# 添加来自混合模型的预测\n",
    "submission.iloc[:,1] = np.floor(np.expm1(blended_predictions(X_test)))\n",
    "# 修复不着边的预测\n",
    "q1 = submission['SalePrice'].quantile(0.0045)\n",
    "q2 = submission['SalePrice'].quantile(0.99)\n",
    "submission['SalePrice'] = submission['SalePrice'].apply(lambda x: x if x > q1 else x*0.77)\n",
    "submission['SalePrice'] = submission['SalePrice'].apply(lambda x: x if x < q2 else x*1.1)\n",
    "submission.to_csv(\"submission_regression1.csv\", index=False)\n",
    "# 规模预测\n",
    "submission['SalePrice'] *= 1.001619\n",
    "submission.to_csv(\"submission_regression2.csv\", index=False)\n",
    "submission.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
